import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import os

# 设置中文字体及整体样式
plt.style.use('seaborn-v0_8')  # 更新样式调用方式
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取数据
df = pd.read_excel('clear_maded_food.xlsx', sheet_name='预制表格')

# 列名映射
column_mapping = {
    'P1': '家常菜',
    'P2': '主食类',
    'P3': '汤羹类',
    'P4': '地方特色',
    'P5': '健康轻食',
    'P6': '网红爆款',
    'P7': '儿童营养餐',
    'P8': '其他类型'
}
df = df.rename(columns=column_mapping)

# 按年龄分组统计均值
age_groups = df.groupby('age')[list(column_mapping.values())].mean()

# 准备雷达图数据
categories = age_groups.columns.tolist()
N = len(categories)
angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist()

# 闭合数据
angles += angles[:1]

# 创建画布
fig = plt.figure(figsize=(10, 10), facecolor='#f5f5f5')
ax = fig.add_subplot(111, polar=True)
ax.set_facecolor('#ffffff')

# 设置极坐标参数
ax.set_theta_offset(np.pi / 2)
ax.set_theta_direction(-1)
ax.set_rlabel_position(355)

# 优化径向网格（版本兼容写法）
max_value = age_groups.values.max() * 1.1
ax.set_ylim(0, max_value)

# 使用兼容方式设置网格样式
ax.yaxis.grid(
    True,
    color='gray',
    linestyle=':',
    alpha=0.6,
    linewidth=0.8
)
ax.set_yticks(np.arange(0, max_value, 0.2))
ax.tick_params(axis='y', labelsize=9)

# 绘制每个年龄组
colors = plt.cm.tab10(np.linspace(0, 1, len(age_groups)))
line_styles = ['-', '--', '-.', ':']

for idx, (age, row) in enumerate(age_groups.iterrows()):
    values = row.values.tolist()
    values += values[:1]

    ax.plot(angles, values,
            color=colors[idx],
            linewidth=1.8,
            linestyle=line_styles[idx % len(line_styles)],
            label=age,
            marker='o',
            markersize=4,
            markeredgecolor='w')

    ax.fill(angles, values,
            color=colors[idx],
            alpha=0.08)

# 优化标签显示
ax.set_xticks(angles[:-1])
ax.set_xticklabels(
    categories,
    fontsize=10,
    color='#2f2f2f',
    rotation=30,
    verticalalignment='center',
    horizontalalignment='center'
)

# 美化标题
plt.title('不同年龄组预制食品购买偏好分析\n',
          fontsize=16,
          color='#2f2f2f',
          pad=25)

# 优化图例
legend = ax.legend(
    loc='upper right',
    bbox_to_anchor=(1.28, 1.05),
    frameon=True,
    framealpha=0.9,
    edgecolor='#e0e0e0',
    title='年龄分组',
    title_fontsize=10,
    fontsize=14,
    ncol=1
)
legend.get_frame().set_facecolor('white')

# 添加版权信息
plt.figtext(0.82, 0.01,
            '© Data Analysis',
            color='gray',
            fontsize=8,
            ha='right')

# 创建保存目录并保存
os.makedirs('radio_map', exist_ok=True)
plt.savefig('radio_map/age_product_radar.png',
            dpi=300,
            bbox_inches='tight',
            facecolor=fig.get_facecolor(),
            transparent=False)

plt.show()